﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using COM.PreAlarm.BLL;
using COM.PreAlarm.Model;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;

namespace TcpListen_HeNan
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetDictPhoneEquipNO();
            
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {

            
            //Equip_MsgSent _Equip_MsgSent = new Equip_MsgSent();
            //List<DBParameter> _listDBParameter = new List<DBParameter>();
            //_listDBParameter.Add(new DBParameter("@TranType", "WaitMsgList"));


            //IDataReader sdr = _Equip_MsgSent.ExecuteReader("[dbo].[Msg_Sel]", _listDBParameter, System.Data.CommandType.StoredProcedure);
            //DataTable dt = new DataTable();
            //dt.Load(sdr);
            //this.labMsg.Text = dt.Rows[0]["Equip_SimNo"].ToString();

            string[] str = GetIpAndPort();
            if (str[0] != null && str[1] != "0")
            {
                this.txtIp.Text = str[0];
                this.txtPort.Text = str[1];
                this.labMsg.Text = str[0];
                //直接就启动监听
                string Ip = this.txtIp.Text.Trim();
                int Port = Convert.ToInt32(this.txtPort.Text.Trim());
                BtnBeinListen(Ip, Port);
                this.labMsg.Text = "监听开启中。。。。。。";
            }
            else
            {
                this.labMsg.Text = "请输入Ip地址和端口号码";
                return;
            }

           
            #region  参考修改代码 被注释掉了
            try
            {
                //string filter = "";
                //string[] a = { "str1", "str2", "str3" };
                //foreach (string i in a)
                //{
                //    filter += i + " or";
                //}
                //Equip_MsgSent msg = new Equip_MsgSent();
                //Equip_MsgSentInfo info = new Equip_MsgSentInfo();
                //List<Equip_MsgSentInfo> list = msg._GetList<Equip_MsgSentInfo>();
                //this.labMsg.Text = list[0].Msg_RecStatus.ToString();
                //info.Equip_No = "12012311122";
                //info.Msg_No = "ssss";
                //info.Msg_SendTime = DateTime.Now;
                //msg.Add(info, "*");
                //msg.Update("Msg_RecStatus", "Equip_No='12012311122'and Msg_No='HNAYAY_20130310093419'", "1", null);
                // this.labMsg.Text = filter.Substring(0,filter.Length-2);
                //
                //Equip_InstalledInfo eif = new Equip_InstalledInfo();
                //Equip_Installed ei = new Equip_Installed();
                //List<Equip_InstalledInfo> list = ei.GetList("Equip_No", "1=1", "", ei.TableName, null);
                //this.labMsg.Text = list[0].Equip_No;


                //DataTable dt = _BdNews.GetDataTable(this.aspNetPage.CurrentPageIndex, this.aspNetPage.PageSize, ref i, "News_ID,NewsTitle,CONVERT(VARCHAR(10),PublishDate,120) PublishDate", string.Format(" HostName LIKE '%{0}%' AND IsDelete = 0  AND  IsPublish = 1", HostName), "PublishDate DESC, News_ID", _listDBParameter);
                //this.labMsg.Text = new Common().GetDateString();
                //Equip_OnlineInfo eof = new Equip_OnlineInfo();
                //Equip_Online eo = new Equip_Online();

                // Equip_OnlineInfo eof = eo.GetModel("Online_00,Online_01", " Rpt_DateTime='2013-03-08'", "", eo.TableName, null);
                // List<Equip_OnlineInfo> list = eo.GetList("Equip_No","Online_00=0","",eo.TableName,null);
                //this.labMsg.Text = eof.Online_01.ToString()+"--"+eof.Online_00.ToString();
                //this.labMsg.Text = list.Count.ToString();


            }
            catch (Exception e1)
            {

            }
            //msg. 
            #endregion


        }
        
        //开启监听
        private void btnListen_Click(object sender, EventArgs e)
        {
            if (Flage)
            {
                return;
            }
            else
            {
                string[] str = GetIpAndPort();
                if (str[0] != null && str[1] != "0")
                {
                    this.txtIp.Text = str[0];
                    this.txtPort.Text = str[1];           
                }
                else
                {
                    this.labMsg.Text = "请输入Ip地址和端口号码";
                    return;
                }

                string Ip = this.txtIp.Text.Trim();
                int Port = Convert.ToInt32(this.txtPort.Text.Trim());
                BtnBeinListen(Ip, Port);
                this.labMsg.Text = "监听开启中。。。。。。";
            }


        }

        //停止监听
        private void btnStopListen_Click(object sender, EventArgs e)
        {
            Flage = false;
            sokWatch.Close();
           
            this.labMsg.Text = "监听终止";
        }
        //修改ip
        private void btnUpIp_Click(object sender, EventArgs e)
        {
            WriteTxt();  
        }

        //定时器 定时扫描信息表 一般3秒钟扫描一次
        private void timer1_Tick(object sender, EventArgs e)
        {
            SendingMsgInfo();//========================
           
        }


        //定时器 初始化设备状态表  或者定时更新设备在线状态 一般2分钟更新一次
        private void timer2_Tick(object sender, EventArgs e)
        {
            UpdateOnlineTable();//==============================

        }

       
       

        //static Thread threadWatch = null;//负责监听客户端连接请求的线程
        static Socket sokWatch = null;//负责监听客户端请求的套接字
        static bool Flage = false;
        static Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
        //static Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();

        //声明一个数据字典用于存放 设备安装表中的电话号码和对应的设备编号
        static Dictionary<string, string> dictPhoneEquipNo = new Dictionary<string, string>();

        #region 监听入口 开始监听程序 
        /// <summary>
        /// 开启监听的方法入口
        /// </summary>
        public static void BtnBeinListen(string Ip, int Port)
        {
            IPAddress address = IPAddress.Parse(Ip);
            
            IPEndPoint endpoint = new IPEndPoint(address, Port);
            sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //=======2013 5.31 修改尝试用线程池的技术
                sokWatch.Bind(endpoint);
                sokWatch.Listen(50);
                //threadWatch = new Thread(WatchConnectioning);
                //threadWatch.IsBackground = true;
                //threadWatch.Start();
                ThreadPool.QueueUserWorkItem(new WaitCallback(WatchConnectioning), sokWatch);
                Flage = true;
            }
            catch
            {
                //处理异常，如果ip设置的不是本机电脑的ip
                
                return;
            }
            
            
        } 
        #endregion


        #region 监听客户端的请求
        /// <summary>
        /// 监听客户端请求的方法  //====2013 5 .31 加入参数改用线程池
        /// </summary>
        static void WatchConnectioning(object obje)
        {
            Socket socket = (Socket)obje;
            while (true)
            {
                try
                {
                   // Socket sokConnetion = sokWatch.Accept();
                    
                    //Thread thr = new Thread(RecMsg);
                    //thr.IsBackground = true;
                    //thr.Start(sokConnetion);
                    Socket proxSocket = socket.Accept();
                    ThreadPool.QueueUserWorkItem(new WaitCallback(RecMsg), proxSocket);
                }
                catch (Exception ex)
                {
                    //有异常，但是在此不作处理 

                }

            }

        } 
        #endregion

        #region 接受客户端数据
        //==================================2013.5.31 修改 
        //public static string strMsgRec = "";
        // 接收客户端发来数据的方法
        static void RecMsg(object socketClientPara)
        {
            Socket sockClient = socketClientPara as Socket;
            sockClient.ReceiveTimeout = 480000;//心跳间隔设置为8分钟
            string phoneKey = "";
            string strMsgRec = "";
            string retStatus;//记录协议返回的状态码 
            while (true)
            {
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
                int length = -1; 
                try
                {
                    //将从客户端接受到的数据存入字节数组中，并返回数组的实际长度
                    try
                    {
                        length = sockClient.Receive(arrMsgRec, 0, arrMsgRec.Length, SocketFlags.None);
                        strMsgRec = System.Text.Encoding.GetEncoding("gb2312").GetString(arrMsgRec, 0, length);
                    }
                    catch (Exception e)
                    {

                        //sockClient.Dispose();
                        sockClient.Shutdown(SocketShutdown.Both);
                        sockClient.Close();
                        sockClient.Dispose();
                        dict[phoneKey] = null;
                        break;
                    }
                    

                    if (strMsgRec.Length > 0)
                    {
                        char strHeader = strMsgRec[0];
                        phoneKey = strMsgRec.Substring(2, 11);
                       
                             //处理客户端发送的心跳包
                            if (strHeader == 'R')//正常，表示客户端在线的情况
                            {

                                //套接字字典中如果没有该套接字（第一次连接或者是断开后重新连接） 就添加进去
                                if (!dict.ContainsKey(phoneKey))
                                {
                                    dict.Add(phoneKey, sockClient);
                                }
                                else
                                {
                                    dict[phoneKey] = sockClient;
                                }
                                //添加返回协议以确认收到客户端连接
                                string serverReturn = strMsgRec.Substring(0, 19) + " OK";
                                byte[] returnData = System.Text.Encoding.GetEncoding("gb2312").GetBytes(serverReturn);
                                dict[phoneKey].Send(returnData);

                                 //此时更新终端表中改终端的状态为 在线
                                // UpdateTerminalStatus(phoneKey, "在线");
                            }
                            else if (strHeader == 'D')//发送信息成功后的返回数据
                            {
                                // 下位机收到信息后返回一个以D 13634567890.。。。的信息来确认其已经收到信息
                                //此时我们应该再 更新一次这个客户端连接 （就是将dict中保存的对象更新一次）
                                //这样做的目的：避免短时间内连续发送信息造成下位机假掉线的情况（因为下位机中的计时器 在短时间内连续收到信息的时候 累计时常可能会超过设定的掉线时长）

                                //套接字字典中如果没有该套接字（第一次连接或者是断开后重新连接） 就添加进去
                                //此处需要再做一次判断，以免中间时间过长
                                retStatus = strMsgRec.Substring(15, 4);//记录返回的状态 DATA
                                if (!dict.ContainsKey(phoneKey))
                                {
                                    dict.Add(phoneKey, sockClient);
                                }
                                else
                                {
                                    dict[phoneKey] = sockClient;
                                }
                                if (retStatus == "DATA") { 
                                
                                }
                        
                            }
                            else if (strHeader == 'M')
                            {
                                //对短信发送做处理
                                string sendPhone = strMsgRec.Substring(31,20);
                                int index = sendPhone.IndexOf('F');
                                sendPhone = sendPhone.Substring(0,index);//发送短信的号码 手机号码或短信平台号码
                                
                                //根据电话号码获取设备编号
                                string equipNo =new Form1().GetEquipNoFromEquipInstalledTable(phoneKey);
                                string sendMsg ="短信内容来自： "+sendPhone + " " + strMsgRec.Substring(47);//信息内容 发信息的电话号码 时间和内容
                                new Form1().RecTelMsgOrTelphone(sendMsg,equipNo);
                            }
                            else if (strHeader == 'T') 
                            { 
                                //对电话做处理
                                
                                string sendPhone = strMsgRec.Substring(31, 20);
                                int index = sendPhone.IndexOf('F');
                                sendPhone = sendPhone.Substring(0, index);//记录打入的电话号码

                                //根据电话号码获取设备编号
                                string equipNo = new Form1().GetEquipNoFromEquipInstalledTable(phoneKey);
                                string sendMsg ="呼入电话："+ sendPhone + "  通话时间：" + strMsgRec.Substring(47);//记录打入电话的起始时间
                                new Form1().RecTelMsgOrTelphone(sendMsg, equipNo);
 
                            }
                            else if (strHeader == 'P')
                            {
                                // UpdateTerminalStatus(phoneKey, "离线");

                            }
                    }
                }

                catch (SocketException ex)
                {
                    //出现异常，终端掉线
                    //UpdateTerminalStatus(phoneKey, "离线");
                   // dict.Remove(phoneKey); 此处做修改 不移除该终端 将该终端对用的socket设为null
                    sockClient.Shutdown(SocketShutdown.Both);
                    sockClient.Close();
                    sockClient.Dispose();
                    dict[phoneKey] = null;

                    break;

                }
                catch (Exception ex)
                {
                    //出现异常，终端掉线
                    //UpdateTerminalStatus(phoneKey, "离线");
                    //dict.Remove(phoneKey);
                    sockClient.Close();
                    sockClient.Dispose();
                    dict[phoneKey] = null;
                    break;

                }
            }

        } 
        #endregion

        #region 向指点客户端发送数据 该方法在此处废弃
        /// <summary>
        /// 向指定终端发送信息
        /// </summary>
        /// <param name="list">终端列表</param>
        /// <param name="msg">要发送的信息</param>
        /// <param name="sendTimes">发送次数</param>
        public static void BtnSendMsgToAll(List<string> list, string sessionName, string msg, string sendTimes, string ranklevel)
        {
            string header = "D 12345678";
            string strMsg = header + sendTimes + msg;
            byte[] arrMsg = System.Text.Encoding.GetEncoding("gb2312").GetBytes(strMsg);

            for (int i = 0; i < list.Count; i++)
            {
                if (dict.ContainsKey(list[i]))
                {
                    dict[list[i]].Send(arrMsg);
                    //成功发送信息的同时要向历史信息表中插入数据
                    //InsertIntoHistoryInfor(list[i], sessionName, msg, "成功", ranklevel);
                }
                else
                {
                    //信息发送失败
                    //InsertIntoHistoryInfor(list[i], sessionName, msg, "失败", ranklevel);
                }
            }
        } 
        #endregion

        #region 设置ip和获取ip
        //获取监听的端口和ip 并将其写入文件；
        private void WriteTxt()
        {
            try
            {
                string path = System.IO.Directory.GetCurrentDirectory() + @"\IPAndPort.txt";
                FileStream aFile = new FileStream(path, FileMode.Open);
                StreamWriter sw = new StreamWriter(aFile);
                //bool truth = true;
                string ip = this.txtIp.Text.Trim();
                string port = this.txtPort.Text.Trim();
                sw.WriteLine(ip);
                sw.WriteLine(port);
                sw.Close();
                aFile.Close();
                this.labMsg.Text = "ip和端口修改成功";
            }
            catch (IOException e)
            {
                Console.WriteLine(e.ToString());
                Console.ReadLine();
                return;
            }
        }

        //获取ip和端口号码
        private string[] GetIpAndPort()
        {
            string[] str = new string[3];
            int i = 0;
            string line;
            try
            {
                FileStream aFile = new FileStream("IPAndPort.txt", FileMode.Open);
                StreamReader sr = new StreamReader(aFile);
                line = sr.ReadLine();
                while (line != null)
                {
                    str[i] = line;
                    i++;
                    line = sr.ReadLine();
                }
                sr.Close();
                aFile.Close();
            }
            catch (IOException e)
            {
                Console.WriteLine(e.ToString());

            }
            return str;

        } 
        #endregion

       
        #region 信息发送并更新发送状态

        //得到数据表 包含设备电话号码，设备编号，信息编号，信息内容。
        private DataTable GetSimNoAndInfoTable()
        { 
            DataTable dt = new DataTable();
            try
            {
                Equip_MsgSent _Equip_MsgSent = new Equip_MsgSent();
                List<DBParameter> _listDBParameter = new List<DBParameter>();
                _listDBParameter.Add(new DBParameter("@TranType", "WaitMsgList"));

                IDataReader sdr = _Equip_MsgSent.ExecuteReader("[dbo].[Msg_Sel]", _listDBParameter, System.Data.CommandType.StoredProcedure);
                dt.Load(sdr);
               
            }
            catch (Exception ex)
            {//发生异常（防止网络连接造成的异常，不做处理）
 
            }
             return dt;
 
        }

       
        //信息发送
        private void SendingMsgInfo()
        {
            DataTable dt = GetSimNoAndInfoTable();
            //List<Equip_MsgSentInfo> listForUpdate = new List<Equip_MsgSentInfo>();
            if (dt.Rows.Count > 0)
            {
                string filter = "";
                //List<Equip_MsgSentInfo> list = new List<Equip_MsgSentInfo>();
                foreach (DataRow dr in dt.Rows)
                {
                    string str = Convert.ToString(dr["Equip_SimNo"]);
                    if (dict.ContainsKey(str) && dict[str] != null)
                    {
                        //首先进行信息的发送
                        string header = "D 12345678";
                        string strMsg = header + Convert.ToString(dr["Msg_Content"]);//信息发送要开始加上发送次数
                        byte[] arrMsg = System.Text.Encoding.GetEncoding("gb2312").GetBytes(strMsg);
                        dict[str].Send(arrMsg);
                        filter += "  (Equip_No='" + Convert.ToString(dr["Equip_No"]) + "' and Msg_No='" + Convert.ToString(dr["Msg_No"]) + "') or";
                    }
                }
                if (filter != "")
                {
                    //根据tcp连接的性质，在此只要能进行上面的信息发送，则这个filter的值就不会为空，
                    //同时也说明 该下位机已经连接到服务器上了，发送的信息就可以收到（tcp是有保证的连接）
                    //那么就不用再根据发送信息后下位机的返回信息来确定下位机是否接收到了信息。
                    filter = filter.Substring(0, filter.Length - 2);
                    UpdatInfoSatus(filter);
                }
            }
        }

      


        //更新信息表的的发送状态 根据tcp连接的性质，
        private void UpdatInfoSatus(string filter)
        {
            try
            {
                Equip_MsgSent ems = new Equip_MsgSent();
                ems.Update("Msg_RecStatus", filter, "1", null);
            }
            catch (Exception ex)
            {
                //防止网络连接异常不做处理
            }
        }

      

         #endregion

        #region 定时更新设备的在线状态


        //从设备安装表中取出对应的设备编码
        static Equip_Installed   ei = new Equip_Installed();
        
        Equip_Online eo = new Equip_Online();
        //更新设备的在线状态 每隔2分钟检查一次 2013-5-15更改
        //更新设备在线状态的时候，在dict中查找如果被如果dict中的键值对在dictPhoneEquipNo中也存在
        //就直接更新，如果在dictPhoneEquipNo中不存在就先加入到其中在在更新，保证了后来添加的设备也能得到及时更新状态
        private  void UpdateOnlineTable()
        {
            string NowTime = new Common().GetDateString();
           
                if (dict.Count > 0)
                {
                    //开始检查监听的哈希表中是否有该电话号码
                    //foreach(var item in dict) 注意对于用foreach遍历的集合，其大小是固定的
                    List<string> listItem = new List<string>(dict.Keys);
                    for (int i = 0; i < listItem.Count; i++)
                    {
                        
                        //dict中的键值对在dictPhoneEquipNo中存在，并且dict的值不为空说明该设备在线
                        if (!dictPhoneEquipNo.ContainsKey(listItem[i]))
                        {
                            //如果dict中的键值对在dictPhoneEquipNo中不存在 先将给设备对应的电话号码和设备编码加入这个数据字典中
                            AddDictPhoneEquipNO(listItem[i]);
                        }
                        try
                        {
                            //加入后就一定包含了，如果不为空说明在线 否则就是不在线 
                            //但是有一种情况：设备安装表中并不村庄该卡号对应的终端编号
                            if (dictPhoneEquipNo[listItem[i]] != null)
                            {
                                if (dict[listItem[i]] != null )
                                {
                                    //设备在线

                                    List<DBParameter> _listDBParameter1 = new List<DBParameter>();
                                    _listDBParameter1.Add(new DBParameter("@Equip_No", dictPhoneEquipNo[listItem[i]]));
                                    _listDBParameter1.Add(new DBParameter("@Rpt_DateTime", NowTime));
                                    _listDBParameter1.Add(new DBParameter("@flage", "online"));
                                    eo.ExecuteNonQuery("[dbo].[AddOrUpdateEquipOnline]", _listDBParameter1, System.Data.CommandType.StoredProcedure);
                                }
                                else
                                {
                                    //设备不在线 数据字典中电话号码对应的连接对象为空 说明该设备离线了

                                    List<DBParameter> _listDBParameter1 = new List<DBParameter>();
                                    _listDBParameter1.Add(new DBParameter("@Equip_No", dictPhoneEquipNo[listItem[i]]));
                                    _listDBParameter1.Add(new DBParameter("@Rpt_DateTime", NowTime));
                                    _listDBParameter1.Add(new DBParameter("@flage", "offline"));
                                    eo.ExecuteNonQuery("[dbo].[AddOrUpdateEquipOnline]", _listDBParameter1, System.Data.CommandType.StoredProcedure);
                                } 
                            }
                        }
                        catch (Exception  ex)
                        {
  
                        }
                    }
                }
        }
        
        #endregion

        /// <summary>
        /// 初始化数据字典将设备安装表中的电话号码和设备编号存入数据字典中
        /// 此处有点问题，就是要保证设备的电话号码不重复，一旦有重复的的不在
        /// </summary>
        private void SetDictPhoneEquipNO()
        {
              Equip_Installed   ei = new Equip_Installed();
        
              List<Equip_InstalledInfo> listEquipInStd =ei.GetList("Equip_No,Equip_SimNo", "1=1", "", ei.TableName, null);
              //将列表中的数据放入数据字典中
              if (listEquipInStd.Count > 0)
              {
                  
                  for (int i = 0; i < listEquipInStd.Count; i++)
                  {
                      if (!dictPhoneEquipNo.ContainsKey(listEquipInStd[i].Equip_SimNo))
                      {
                          dictPhoneEquipNo.Add(listEquipInStd[i].Equip_SimNo,listEquipInStd[i].Equip_No);
                      }
                      //else
                      //{
                      //    throw new Exception("设备电话号码有重复了");
                      //}
                      
                  }
                  this.label1.Text = listEquipInStd.Count.ToString();
              }
              
             //之后列表亦无用，可以释放掉
              //listEquipInStd = null;               
        }


        /// <summary>
        /// 如果数据字典中没有存放该电话号码对应的的键值对，说明该设备有可能是新添加的初始化数据字典时还没有该数据
        /// </summary>
        /// <param name="phone"></param>
        private void AddDictPhoneEquipNO(string phone)
        {
            phone = phone.Trim();
            Equip_InstalledInfo eiIfo = ei.GetModel("Equip_No"," Equip_SimNo='"+phone+"'","",ei.TableName,null);
            if (eiIfo != null)
            {
                if (!dictPhoneEquipNo.ContainsKey(phone))
                {
                    dictPhoneEquipNo.Add(phone, eiIfo.Equip_No);
                }
                //else
                //{
                //    throw new Exception("设备电话号码重复了");
                //}

            }
            else
            {
                //如果设备安装表中并没有该终端号码对应的设备 则设为空。（原因：1，可能用户没有填写设备安装表西信息 2，或者是填写的卡号和在下位机中设置卡号的不一致）
                dictPhoneEquipNo.Add(phone, null);
            }
 
        }


        /// <summary>
        /// 记录时候短信或者是电话通话的相关内容
        /// </summary>
        /// <param name="tMsg">短信内容或者是电话相关信息</param>
        /// <param name="equipNo">接收机编码</param>
        private void RecTelMsgOrTelphone(string tMsg, string equipNo)
        {

            //string tMsg = context.Request["sendMsg"];

            //string equipNo = context.Request["equipNo"];
            //生成信息编码
            string msgNo = equipNo.Substring(0, 4) + "FS_" + string.Format("{0}", DateTime.Now.ToString("yyyyMMddHHmmss"));
            COM.PreAlarm.Model.Msg_SentInfo msi = new COM.PreAlarm.Model.Msg_SentInfo();
            msi.Msg_No = msgNo;
            msi.Msg_Content = tMsg;
            COM.PreAlarm.BLL.Msg_Sent msg = new COM.PreAlarm.BLL.Msg_Sent();
            msg.Add(msi, "*");//插入信息表

            COM.PreAlarm.BLL.Equip_MsgSent ems = new COM.PreAlarm.BLL.Equip_MsgSent();
            COM.PreAlarm.Model.Equip_MsgSentInfo emsi = new COM.PreAlarm.Model.Equip_MsgSentInfo();
            emsi.SetIsNew(true);
            emsi.Equip_No = equipNo;
            emsi.Msg_No = msi.Msg_No;
            emsi.Msg_SendTime = DateTime.Now;
            emsi.Msg_RecStatus = 1;
            ems.Add(emsi, "*");//插入信息备案表

        }

       
        /// <summary>
        /// 通过电话号码获取对应的设备编码 
        /// 使用条件，当一个设备刚连到服务器的时候，还没有经过信息发送来初始化设备编码，此时设备编码为空，要初始化一下
        /// 
        /// </summary>
        /// <param name="phone"></param>
        private string GetEquipNoFromEquipInstalledTable(string phone)
        {
            string equipNo;
            phone = phone.Trim();

            Equip_InstalledInfo eiIfo = ei.GetModel("Equip_No", " Equip_SimNo='" + phone + "'", "", ei.TableName, null);
            if (eiIfo != null)
            {
                equipNo = eiIfo.Equip_No;
            }
            else
            {
                equipNo = null;
            }
            return equipNo;

        }
        
        #region 写文件 导出数据
        //private void btnDaoChu_Click(object sender, EventArgs e)
        //{
        //    Equip_Installed ei = new Equip_Installed();

        //    List<Equip_InstalledInfo> listEquipInStd = ei.GetList("Equip_SimNo", "1=1", "", ei.TableName, null);


        //        try
        //        {
        //            string path = System.IO.Directory.GetCurrentDirectory() + @"\phones.txt";
        //            FileStream aFile = new FileStream(path, FileMode.Append);
        //            StreamWriter sw = new StreamWriter(aFile);

        //            for (int i = 0; i < listEquipInStd.Count; i++)
        //            {
        //              sw.WriteLine(listEquipInStd[i].Equip_SimNo);
        //            }


        //            sw.Close();
        //            aFile.Close();

        //        }
        //        catch (IOException ex)
        //        {
        //            Console.WriteLine(e.ToString());
        //            Console.ReadLine();
        //            return;
        //        }

        //    this.labMsg.Text =  listEquipInStd.Count.ToString();



        //} 
        #endregion
    }
}
